 class RecibosController < ApplicationController
#MODULE: Gestión Salarial

  # GET /recibos
  # GET /recibos.xml
  def index
  end

  def email #DESC: Enviar por mail los recibos.
    if params[:date]
      @rechazados = []
      @enviados = 0
      lista = Recibo.find(:all, :conditions => ["mes = ? and anho = ? AND aguinaldo=?", params[:date][:month], params[:date][:year], params[:recibo][:tipo]])
      return if lista.empty?
      lista.each do |rec|
        rec.mensaje = params[:mensaje]
        rec.save
        next unless rec.usuario.try(:enviar_email)
        if rec.usuario.try(:email)
          ReciboMailer.deliver_recibo_email(rec)
          @enviados += 1
        else
          @rechazados << rec.usuario
        end
      end
    end
  end

  # GET /recibos/1
  # GET /recibos/1.xml
  def show
    @recibo = Recibo.find(params[:id])
    respond_to do |format|
      format.html {render :layout=>!params[:cbox]}
      format.xml  { render :xml => @recibo }
    end
  end

  # GET /recibos/new
  # GET /recibos/new.xml
  def new
    @recibo = Recibo.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @recibo }
    end
  end

  # GET /recibos/1/edit
  def edit
    @recibo = Recibo.find(params[:id])
  end

  # POST /recibos
  # POST /recibos.xml
  def create
    params[:recibo][:mes]=params[:date][:mes]
    params[:recibo][:anho]=params[:date][:anho]
    @recibo = Recibo.new(params[:recibo])

    respond_to do |format|
      if @recibo.save
        flash[:notice] =  'Recibo creada correctamente.'
        format.html { params[:oper].nil? ? redirect_to(@recibo) : render(:text => "Ok")}
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @recibo.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /recibos/1
  # PUT /recibos/1.xml
  def update
    @recibo = Recibo.find(params[:id])

    respond_to do |format|
      if @recibo.update_attributes(params[:recibo])
        flash[:notice] = 'Recibo actualizado correctamente.'
        format.html { redirect_to(@recibo) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @recibo.errors, :status => :unprocessable_entity }
      end
    end
  end

  # DELETE /recibos/1
  # DELETE /recibos/1.xml
  def destroy
    @recibo = Recibo.find(params[:id])
    @recibo.destroy

    respond_to do |format|
      format.html { redirect_to(recibos_url) }
      format.xml  { head :ok }
    end
  end

  def datos #IGNORE
    registros, count = find_by_params(params, :class => Recibo, :includes => [:usuario], :tipo_join => :joins)
    # Construct a hash from the ActiveRecord result
    return_data = Hash.new()
    return_data[:page] = params[:page]
    return_data[:total] = (count.to_f / params[:rows].to_i).ceil
    return_data[:records] = count

    return_data[:rows] = registros.collect{|u| {:id=>u.id,
        :cell=>[u.tipo,
          u.usuario.try(:nombres),u.usuario.try(:apellidos),I18n.translate(:date)[:month_names][u.mes.to_i], u.anho, I18n.l(u.created_at:formats=>:short), u.observacion
        ]}}

    # Convert the hash to a json object
    render :text=>return_data.to_json, :layout=>false
  end

  #Deshacer recibos
  def deshacer #DESC: Deshacer los recibos generados en un periodo.
    if request.method == :post
      @procesado=0
      condiciones="mes = #{params[:date][:month]} AND anho = #{params[:date][:year]}"
      condiciones+=" AND aguinaldo=#{params[:recibo][:aguinaldo]}" unless params[:recibo][:aguinaldo].blank?
      ids=Recibo.de_usuarios_activos.all(:conditions=>condiciones,:select=>"id").map(&:id).join(',')
      unless ids.blank?
        Movimiento.update_all("recibo_id=null","recibo_id IN (#{ids})")
        condiciones+=" AND id IN (#{ids})"
        @procesado = Recibo.delete_all(condiciones)
      end
    end
  end

  def previsualizar #DESC: Previsualizar los recibos.
    if request.method == :post
      user = Usuario.find(params[:usuario_id])
      @recibo = Recibo.generar(user, :preview => true, :mes => params[:date][:month], :anho => params[:date][:year], :desde => params[:desde], :hasta => params[:hasta])
      @partial="detalles_salario"
      @acreditaciones=@descuentos=[]
      @total_acreditaciones=@recibo.valor_bruto
      @total_descuentos=0
      @tipo="Salario"
      @partial="detalles_salario"
      @descuentos=@recibo.movimientos.descuentos
      @total_descuentos=@recibo.movimientos.descuentos.all.sum(&:valor)
      @acreditaciones =@recibo.movimientos.creditos
      @total_acreditaciones+=@recibo.movimientos.creditos.all.sum(&:valor)
      render :show
    end
  end

  #Genera recibos
  def generar_salarios  #DESC: Generar los recibos de salarios
    if request.method == :post
      para_un_usuario=[["por_usuario_id","find_all_by_id"],[params[:usuario][:id]]]
      para_todos=[["de_usuarios_activos","activos"],nil]
      scopes,conds= params[:usuario][:id].blank? ? para_todos : para_un_usuario
      existe = Recibo.send(scopes[0],conds).aguinaldos?(false).find_by_mes_and_anho( params[:date][:month], params[:date][:year])
      @procesado=0
      
      #verificar si ya se genero
      if existe.nil?
        usuarios = Usuario.send(scopes[1],conds)
        usuarios.each do |user|
        @procesado+=1 if Recibo.generar(user,:mes => params[:date][:month],
            :anho => params[:date][:year],:desde => params[:desde], :hasta => params[:hasta])
        end
#        @procesado = params[:usuario][:id].blank? ?
#          Recibo.find(:all, :conditions => {:mes => params[:date][:month], :anho => params[:date][:year]}).count : 1
      else
        @procesado = "Ningun"
      end
    end
    generar_template
  end

  def generar_aguinaldos  #DESC: Generar los recibos de aguinaldos
    if request.method == :post
      @procesado = "Ningun"
      para_un_usuario=[["por_usuario_id","find_all_by_id"],[params[:usuario][:id]]]
      para_todos=[["de_usuarios_activos","activos"],nil]
      scopes,conds= params[:usuario][:id].blank? ? para_todos : para_un_usuario
      existe =Recibo.send(scopes[0],conds).aguinaldos?(true).find_all_by_anho(params[:date][:year],:limit=>1)
      #verificar si ya se genero
      if existe.empty?
        @procesado=0
        usuarios = Usuario.send(scopes[1],conds)
        usuarios.each do |user|
          @procesado+=1 if Recibo.generar_aguinaldo(user,
            :mes => params[:date][:month],
            :anho => params[:date][:year],
            :desde => params[:desde],
            :hasta => params[:hasta])
        end
      end
    end
    generar_template
  end

  private
  def generar_template
    respond_to do |format|
      format.html {render :template => "recibos/generar"}
      format.xml  { render :xml => @recibo }
    end
  end
end
